package com.univocity.trader.strategy;

import com.univocity.trader.account.*;
import com.univocity.trader.candles.*;
import com.univocity.trader.config.*;
import com.univocity.trader.indicators.*;

/**
 * 一个 {@code Strategy} 负责处理由 {@link com.univocity.trader.Exchange} 传输的价格更新，
 * 并生成一个信号 {@link Signal}，然后提交给 {@link Trader#trade(Candle, Signal, Strategy)}
 * 以打开、维持或关闭一个交易。
 *
 * 那些使用 {@link com.univocity.trader.indicators} 包中任何指标实现的策略。
 * 实现应该从 {@link IndicatorStrategy} 扩展以进行适当的初始化。
 *
 * @see Signal
 * @see Trader
 * @see Indicator
 * @see IndicatorStrategy
 */
public interface Strategy {

	/**
	 * 处理一个符号的最新价格更新以产生一个信号 {@link Signal}
	 *
	 * @param candle 从实时的交易或一个符号的交易历史中接收到的最新蜡烛（通常由 {@link com.univocity.trader.simulation.SimulatedExchange} 管理）。
	 *
	 * @param context
	 *
	 * @return 购买（{@code BUY}）、出售（{@code SELL}）或什么都不做（即 {@code NEUTRAL}）的指示。任何其他值都将被处理这个 Signal 的交易忽略。
	 */
	Signal getSignal(Candle candle, Context context);

	/**
	 * 这个策略适用单边活两边（{@code LONG}、{@code SHORT} ）。
	 * 当 {@link #getSignal(Candle, Context)} 产生一个Buy信号，交易将尝试退出任何已打开的短期头寸，并将尝试在给定工具上做多。
	 * 如果信号是 {@code SELL}，交易员将尝试关闭任何开放的长期头寸，并在当前工具上做空。
	 * 如果这个策略产生的信号只适用于 {@code LONG} 或 {@code SHORT} 头寸，{@code tradeSide} 方法必须返回要工作的哪一侧。
	 * 只有当账户中允许做空（即 {@link AccountConfiguration#shortingEnabled()}）时，这个方法才相关。
	 * @return 这个策略的交易侧，如果两者都可以考虑则为 {@code null}。
	 */
	default Trade.Side tradeSide() {
		return null;
	}

	default boolean exitOnOppositeSignal(){
		return true;
	}
}